############################################################################################
# this file for the study the makfile record and improve the make kownhow
#  Author 			Create Data					Modify Reason
#	HeHu			 2022-2-22					Add the makefile with auto generate depend
###########################################################################################

#src := main.c func.c
#obj := $(src:c=o)

#OBJS := main.o func.o

# all : main.o test.o

# main.o : main.c func.c
# 	$(CC) -o main.o main.c func.c
# test.o : test.c
# 	$(CC) -o test.o -c test.c

# $@ 当前规则中出发命令被执行的目标
# $^ 当前规则中的所有依赖
# $< 规则中的第一个依赖

#$(EXE) : $(OBJS)
#	$(CC) -o $@ $^
#$(OBJS) : %.o : %.c 
#	$(CC) -o $@ -c $^

#.PYONY : clean rebuild all

#all : $(EXE)


#clean:
#	$(RM) -rf $(OBJS) $(EXE)

########################################################################################################
# 编译原理
# 	1. 预处理 ==>将头文件或者宏定义插入到代码片段中





# Linux 的sed命令
# 	sed 流编辑器 ==>流文本的修改(增删改查)
#	sed 字符串替换方式为 : sed 's:src:des:g'
#		eg: echo "test=>abc+abc=abc		| sed 's:abc:xyz:g'
#				  test=>xyz+xyz=xyz			
#	sed 的正则表达式
#	sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g'




# set -e 使命令在同一个进程执行
# make -r 可以使make 禁用模式规则
########################################################################################################







#EXE := hello.out

#DIR_OBJS := objs
#DIR_TARGET := target
#DIR := $(DIR_OBJS) $(DIR_TARGET)


#DIR_DEPS := deps
#DIR_EXES := exes
#DIR_OBJS := objs






#DIRS := $(DIR_DEPS) $(DIR_EXES) $(DIR_OBJS)

# exes/app.out




#DEPS := $(SRCS:.c=.dep)
# deps/func.dep deps/main.dep
#DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))
# objs/main.o objs/func.o
#OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))

# $(CC) -MM -E $^ | sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g' > $@
#GEDEP_FILE := sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g' 




#$(TARGET) : $(DIR) $(OBJS)
#	$(CC) -o $@ $(OBJS)

#$(DIR) : 
#	$(MK) $@
#$(DIR_OBJS)/%.o : %.c func.h
#    ifeq ($(DEBUG),true) #debug 
#		$(CC) -o $@ -g -c $< (这里不能用$^为什么？ ===> GCC编译器在识别依赖的时候不会去找头文件)
#   else					#空格
#		$(CC) -o $@ -c $<
#   endif

#$(DIR_OBJS)/%.o : %.c
#    ifeq ($(DEBUG),true) #debug 
#		$(CC) -o $@ -g -c $^
#    else					#空格
#		$(CC) -o $@ -c $^
#    endif

#rebuild : clean all

# exes/app.out  objs		exes

#all : $(EXE) $(DIR_OBJS) $(DIR_EXES)
# 为什么用上面的这个规则会出现找不到obj/main.o ?
# 如果是 $(EXE)在前面 make all 首先会去找$(EXE)的依赖，执行$(EXE) : $(OBJS)
# 然后发现依赖$(OBJS)-->objs/main.o,就会去执行$(DIR_OBJS)/%.o : %.c，发现编译main.c的时候需要将main.o
# 放进objs/目录下,==>但是此时还没有objs文件目录，报错
#all : $(DIR_OBJS) $(DIR_EXES) $(EXE)





# deps/func.dep deps/main.dep
# include 会去看DEP文件是否存在
# include "-" 加上'-'会导致make 忽略报告警告和错误
#ifeq ("$(MAKECMDGOALS)", "all")
#-include $(DEPS)   
#endif


#ifeq ("$(MAKECMDGOALS)", "")
#-include $(DEPS)   
#endif

# objs/main.o objs/func.o
#$(EXE) : $(OBJS)
#	@echo "Success!!! Target=>$@"
#	$(CC) -o $@ $^

# objs/main.o objs/func.o 
#$(DIR_OBJS)/%.o : %.c
#	$(CC) $(CFLAGS) -o $@ -c $(filter %.c, $^) 

#$(DIRS) :
#	$(MKDIR) $@


#
# deps/func.dep deps/main.dep
# 为什么需要判断？  ==>如果DIR_DEPS文件不存在，会去创建文件夹,但是在make 的时候会生成dep/func.dep文件
# 此时更新了DIR_DEPS文件夹内容，时间戳更新会继续make 判断有更新会一直生成
#ifeq ("$(wildcard $(DIR_DEPS))", "")
#$(DIR_DEPS)/%.dep : $(DIR_DEPS) %.c
#else
#$(DIR_DEPS)/%.dep : %.c
#endif
#	@echo "Creating $@...."
#	@set -e; 
#	$(CC) $(CFLAGS) -MM -E $(filter %.c, $^) | sed 's,\(.*\)\.o[ :]*,objs/\1.o $@ : ,g' > $@

#clean : 
#	$(RM) $(DIRS)
#rebuild :
#	$(MAKE) clean
#	$(MAKE) all

#.PYONY : all clean rebuild


####################################################################################################################

# Date						Modify Reason
# 2022-2-26					file path search integrate



###################################################################################################################

#CC := g++
#RM := rm -rf
#MKDIR := mkdir


#DIR_BUILD := build
#DIR_SRC := src
#DIR_INC := inc

#TYPE_SRC := .cpp
#TYPE_INC := .h
#TYPE_OBJ := .o

#CFLAGS := -I $(DIR_INC)
#ifeq ($(DEBUG),true)
#CFLAGS += -g
#endif

#LFLAGS := -pthread

#APP := $(DIR_BUILD)/app.out

#HDRS := $(wildcard $(DIR_INC)/*$(TYPE_INC))
# 去除头文件前缀，报错头文件名字
#HDRS := $(notdir $(HDRS))




#OBJS := $(wildcard $(DIR_SRC)/*$(TYPE_SRC))
#OBJS := $(OBJS:$(TYPE_SRC)=$(TYPE_OBJ))
#将依赖文件路径前缀替换成build build/main.o
#OBJS := $(patsubst $(DIR_SRC)/%, $(DIR_BUILD)/%,$(OBJS))

#vpath %$(TYPE_INC) $(DIR_INC)
#vpath %$(TYPE_SRC) $(DIR_SRC)
 
# all 依赖.o 和app
#all : $(DIR_BUILD) $(APP)
#	@echo "Success Target ==> $(APP)"

#$(DIR_BUILD) :
#	$(MKDIR) $@

#$(APP) : $(OBJS)
#	$(CC) $(LFLAGS) -o $@ $^

#$(DIR_BUILD)/%$(TYPE_OBJ) : %$(TYPE_SRC) $(HDRS)
#	$(CC) $(CFLAGS) -o $@ -c $<

#clean :
#	$(RM) $(DIR_BUILD)


####################################################################################################################

# Date						Modify Reason
# 2022-2-27					打造适合工程的Makefile
###################################################################################################################


###################################################################################################################
# 1.GCC 在进行静态库链接的时候必须遵循严格的依赖关系
#	gcc -o app.out x.a y.a z.a
#	其中依赖的关系必须为: x.a -> y.a y.a -> z.a
#	默认情况下遵循从左到右的依赖关系


# 2.如果不清楚库间的依赖，可以用-Xlinker 自动确定依赖关系
#	gcc -o app.out -Xlinker "-(" z.a y.a x.z -Xlinker "-)"	



###################################################################################################################



include pro-cfg.mk
include cmd-cfg.mk
include pro-rule.mk



